package ar.edu.utn.frba.dds.opendesigners.resultados;

import java.math.BigDecimal;

import ar.edu.utn.frba.dds.opendesigners.aerolineas.AerolineaAdapter;
import ar.edu.utn.frba.dds.opendesigners.almacenamiento.Estadistica;
import ar.edu.utn.frba.dds.opendesigners.fecha.Fecha;
import ar.edu.utn.frba.dds.opendesigners.formato.FormatoSimple;

public class VueloDirecto implements Asiento  {
	
	private AerolineaAdapter aerolinea;             //Aerolinea: [Lanchita|Oceanic]
    private String numeroVuelo;                             //Nro de vuelo
    private String numeroAsiento;                   //Nro de asiento
    private BigDecimal precio;                              //Precio del asiento
    private char tipo;                                              //Tipo de asiento (clase): [T: Turista|E: Ejecutiva|P: Primera Clase]
    private char ubicacion;                                 //Ubicación del asiento: [V: Ventana|C: Centro|P: Pasillo]
    private char estado;                                 //Estado: [R: Reservado|D: Disponible]
    private String dni;
    private String origen;
    private String destino;
    private Fecha fechaSalida;                              //Tiene el dia y la hora todo junto
    private Fecha fechaLlegada;                             //Tiene el dia y la hora todo junto
    
    FormatoSimple formatoFecha;

    public VueloDirecto(){
	        //Defino que las fechas de salida y llegada se reciben y "almacenan" en este formato. 
	       this.formatoFecha = new FormatoSimple("dd/MM/yyyy HH:mm");
	}
	public boolean precioMenorQue(BigDecimal precio){
	       return (this.getPrecio().compareTo(precio) < 0);
	}
	
	public boolean precioMayorQue(BigDecimal precio){
	       return (this.getPrecio().compareTo(precio) >= 0);
	}
	
	public BigDecimal getPrecio() {
	       return this.precio;
	}
	
	public void setPrecio(BigDecimal precio){
	       this.precio = precio;
	}
	
	public void agregarPrecio(BigDecimal precio) {
	       this.precio = this.precio.add(precio);
	}
	
	public String getNombreAerolinea() {
	       return this.aerolinea.getNombreAerolinea();
	}
	
	public AerolineaAdapter getAerolinea() {
	       return this.aerolinea;
	}
	
	public void setAerolinea(AerolineaAdapter aerolinea) {
	       this.aerolinea = aerolinea;
	}
	
	public String getNumeroVuelo(){
	       return this.numeroVuelo;
	}
	
	public void setNumeroVuelo(String numeroVuelo){
	       this.numeroVuelo = numeroVuelo;
	}
	
	
	public String getNumeroAsiento() {
	       return this.numeroAsiento;
	}
	
	public void setNumeroAsiento(String numeroAsiento) {
	       this.numeroAsiento = numeroAsiento;
	}
	
	public void setDni(String dni){
	       this.dni = dni;
	}
	
	@Override
	public String getDni(){
	       return this.dni;
	}       
	
	public char getTipo() {
	       return this.tipo;
	}
	
	public void setTipo(char tipo){
	       this.tipo = tipo;
	}
	
	public char getUbicacion() {
	       return this.ubicacion;
	}
	
	public void setUbicacion(char ubicacion) {
	       this.ubicacion = ubicacion;
	}
	
	public char getEstado() {
	       return this.estado;
	}
	
	public void setEstado(char state) {
	       this.estado = state;
	}
	
	public void setEstado(boolean state) {
		if (state){
			this.estado = 'R'; //Reservado
		}
		else{
			this.estado = 'D'; //Disponible
		}
	}
	

	//Se recibe la fecha de salida en formato dd/MM/yyyy HH:mm
	public void setFechaSalida(String fechaSalida){
	       this.fechaSalida = new Fecha(this.formatoFecha.crear(fechaSalida));
	}
	
	//Se recibe POR SEPARADO el día de salida formato dd/MM/yyyy y la hora en formato HH:mm
	public void setFechaSalida(String fechaSalida, String horaSalida){
	       this.fechaSalida = new Fecha(this.formatoFecha.crear(fechaSalida + " " + horaSalida));
	}
	
	public Fecha getFechaSalida(){
	       return this.fechaSalida;
	}
	       
	//Devuelve la fecha de salida en un formato custom
	public String getFechaSalida(String formato){
	       return this.fechaSalida.stringfechaYHora(formato);
	}
	
	//Se recibe la fecha de salida en formato dd/MM/yyyy HH:mm
	public void setFechaLlegada(String fechaLlegada){
	       this.fechaLlegada = new Fecha(this.formatoFecha.crear(fechaLlegada));
	}
	
	//Se recibe POR SEPARADO el día de salida formato dd/MM/yyyy y la hora en formato HH:mm
	public void setFechaLlegada(String fechaLlegada, String horaLlegada){
	       this.fechaLlegada = new Fecha(this.formatoFecha.crear(fechaLlegada + " " + horaLlegada));
	}
	
	public Fecha getFechaLlegada(){
	       return this.fechaLlegada;
	}
	
	//Devuelve la fecha de salida en un formato custom
	public String getFechaLlegada(String formato){
	       return this.fechaLlegada.stringfechaYHora(formato);
	}
	
	public void setOrigen(String origen){
	       this.origen = origen;
	}
	
	public String getOrigen(){
	       return this.origen;             
	}
	
	public void setDestino(String destino){
	       this.destino = destino;
	}
	
	public String getDestino(){
	       return this.destino;
	}
	/*
	public boolean equals(Asiento asiento){
	       return (this.getAerolinea() == asiento.getAerolinea() ) && (this.getNumeroVuelo() == asiento.getNumeroVuelo()) && (this.getNumeroAsiento() == asiento.getNumeroAsiento());
	}
	*/
	public String toString() {
	       return new String(this.aerolinea + " " + this.numeroVuelo + " " + this.numeroAsiento + " " + "\n");
	}
	public void reservar() {
	       this.aerolinea.reserva(this);
	}
	
	public void comprar() {
	       this.aerolinea.comprar(this);
	}
	
	@Override
	public Integer getTiempoViaje(){
	       return this.fechaLlegada.getDiferenciaEnHorasEntreFechas(this.fechaSalida);
	}
	
	public Integer getPopularidad(){
	       
		Estadistica estadisticas = Estadistica.getInstancia();
		   
		return estadisticas.getNroComprasPorVuelo(this.getNumeroVuelo());
	}
	
//	@Override
//	public BigDecimal sumarPrecio(BigDecimal monto) {
//		BigDecimal total = new BigDecimal(0);
//		
//		total = total.add(this.getPrecio());
//				
//		return total;
//	}
	
	@Override
	public void sumarPrecio(BigDecimal monto) {
		this.precio = this.getPrecio().add(monto);
	}
	
	@Override
	public Integer getCantidadEscalas() {
		return 0;
	}	
}
